package com.itaming.lycheeframework.core.config;

import com.itaming.lycheeframework.core.formatter.FlexibleDateFormatter;
import com.itaming.lycheeframework.core.formatter.LocalDateFormatter;
import com.itaming.lycheeframework.core.formatter.LocalDateTimeFormatter;
import com.itaming.lycheeframework.core.formatter.LocalTimeFormatter;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateTimeFormatAnnotationFormatterFactory;
import org.springframework.format.datetime.standard.Jsr310DateTimeFormatAnnotationFormatterFactory;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Core 模块 WebMvc 配置类
 *
 * @author A.Ming
 */
@AutoConfiguration
public class CoreWebMvcConfiguration implements WebMvcConfigurer {

    /**
     * 添加自定义的格式化器
     *
     * <p>
     * 格式化器仅适用于常规参数，如 {@code @RequestParam}、{@code @PathVariable} 等，
     * {@code @RequestBody} 接收的 Json 参数通过 Jackson 处理。
     *
     * @param registry 格式化器注册表
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        // 添加自定义的格式化器
        registry.addFormatter(new FlexibleDateFormatter());
        registry.addFormatter(new LocalDateFormatter());
        registry.addFormatter(new LocalTimeFormatter());
        registry.addFormatter(new LocalDateTimeFormatter());

        // 添加 @DateTimeFormat 支持
        // 添加自定义格式化器后默认的 DateTimeFormatAnnotationFormatterFactory 将失效
        // 在这里重新添加，并且要在自定义格式化器之后添加，使其优先级更靠前
        // Date类型支持
        registry.addFormatterForFieldAnnotation(new DateTimeFormatAnnotationFormatterFactory());
        // Java8日期时间类型支持
        registry.addFormatterForFieldAnnotation(new Jsr310DateTimeFormatAnnotationFormatterFactory());
    }

}
